﻿using Levfier.GUI.EditorControls.Chains;
using Levfier.GUI.EditorControls.Exceptions;
using Levfier.Proccessors.Chains;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;

namespace Levfier.GUI.EditorControls.IO
{
    /// <summary>
    /// InputControl.xaml の相互作用ロジック
    /// </summary>
    [Serializable]
    public partial class InputControl : ProccessorControl
    {
        /// <summary>
        /// コントロールの名前
        /// </summary>
        public static readonly string ControlName = "Input";

        /// <summary>
        /// 入力チェイン
        /// </summary>
        private BoundChain chain;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="chain"></param>
        public InputControl(BoundChain chain)
        {
            InitializeComponent();
            this.chain = chain;
        }

        /// <summary>
        /// 下流チェインコントロールを接続する
        /// </summary>
        /// <param name="chainControl">接続対象コントロール</param>
        public override void SetLowerChainControl(IChainControl chainControl)
        {
            //入力チェインをチェインコントロールに設定する
            chainControl.SetChain(this.chain);

            this.lowerChainControls.Add(chainControl);
        }

        /// <summary>
        /// 下流チェインコントロールを削除する
        /// </summary>
        /// <param name="chainControl">削除対象コントロール</param>
        public override void RemoveLowerChainControl(IChainControl chainControl)
        {
            this.lowerChainControls.Remove(chainControl);
        }

        /// <summary>
        /// このメソッドが呼び出された時、不正な方向で接続された時なので例外を吐く
        /// </summary>
        /// <param name="chainControl">チェインコントロール</param>
        /// <exception cref="ChainFailException">接続失敗例外</exception>
        public override void SetUpperChainControl(IChainControl chainControl)
        {
            throw new ChainFailException("接続方向が不正です。", null);
        }

        /// <summary>
        /// このメソッドが呼び出された時、不正な方向で接続された時なので例外を吐く
        /// </summary>
        ///// <param name="chainControl">チェインコントロール</param>
        public override void RemoveUpperChainControl(IChainControl chainControl)
        {
            //何もしない
            //throw new ChainFailException("ここに入ったら実装ミス", null);
        }

        /// <summary>
        /// 選択された時の動作
        /// 末端の子クラスで実装すること
        /// </summary>
        /// <param name="sender">イベント発生源</param>
        public override void Select(object sender)
        {
            this.border.BorderBrush = this.selectedBrush;
        }

        /// <summary>
        /// 選択解除された時の動作
        /// 末端の子クラスで実装すること
        /// </summary>
        /// <param name="sender">イベント発生源</param>
        public override void Unselect(object sender)
        {
            this.border.BorderBrush = Brushes.Transparent;
        }

        /// <summary>
        /// 入力は消すことができないので例外を発生する
        /// </summary>
        /// <exception cref="IllegalEditOperationException">不正操作</exception>
        public override IEnumerable<UIElement> Delete()
        {
            throw new IllegalEditOperationException("不正操作：入力は削除できません。", null);
        }
    }
}
